<?php
class Cont_RecBSN extends GenericBSN {

	function __construct() {
		$this->dao = new Cont_RecDAO();		
	}

	public function consultar($vars) {
		$this->preencher($vars);
		
		if (isset($vars['fltTipo']) && ($vars['fltTipo'] != 'T')) {
			if (strlen($this->where) > 0) {
				$this->where .= " and ";
			} else {
				$this->where = " where ";
			}
			$this->where .= "tipo = :tipo";
			$this->params['tipo'] = $vars['fltTipo'];
		}
		
		if (isset($vars['pagas'])) {
			if (strlen($this->where) > 0) {
				$this->where .= " and ";
			} else {
				$this->where = " where ";
			}
			$this->where .= " recebto <> ''";
		}
		$this->Records = $this->dao->consultar($this->where, $this->params, $this->order . $this->limit);
		$this->Result  = "OK";
	}
	
	public function consultarPK($vars) {
		$this->Records = $this->dao->consultarPK($vars['id']);
		$this->Result = "OK";
	}
	
	public function inserir($vars, $finalizarTransacao = true) {
		$registro['data']		= $vars['data'];
		$registro['adquirente'] = $vars['ad_id'];
		$registro['historico'] 	= $vars['historico'];
		$registro['vcto'] 		= $vars['vcto'];
		$registro['vr_titulo']	= str_replace(',', '.', str_replace('.', '', $vars['vr_titulo']));

		if (isset($vars['juros']) && ($vars['juros'] != "")) {
			$registro['juros']		= str_replace(',', '.', str_replace('.', '', $vars['juros']));
		}

		if (isset($vars['recebto']) && ($vars['recebto'] != "")) {
			$registro['recebto']	= $vars['recebto'];
		}
		
		if (isset($vars['vr_recebido']) && ($vars['vr_recebido'] != "")) {
			$registro['vr_recebido'] = str_replace(',', '.', str_replace('.', '', $vars['vr_recebido']));
		}
		
		if (isset($vars['pd_id']) && ($vars['pd_id'] != "")) {
			$registro['pedido']		= $vars['pd_id'];
		}
		
		$registro['parcela']	= isset($vars['parcela']) ? $vars['parcela'] : "";
		$registro['tipo']		= isset($vars['tipo']) ? $vars['tipo'] : "M";
		
		if (isset($vars['pl_id']) && ($vars['pl_id'] != "")) {
			$registro['plano']		= $vars['pl_id'];
		}
		
		if (isset($vars['ct_id']) && ($vars['ct_id'] != "")) {
			$registro['conta']		= $vars['ct_id'];
		}
		
		if (isset($vars['historico2']) && ($vars['historico2'] != "")) {
			$registro['historico2']	= $vars['historico2'];
		}
		
		try {
			$this->Record = $this->dao->inserir($registro, $finalizarTransacao);
			$this->Result  = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro ao tentar inserir conta a receber: " . $e->getMessage();
		}
	}
	
	public function receber($vars, $finalizarTransacao = true) {
		try {
			if (!isset($vars['recebto'])) {
				throw new Exception("Data de recebimento não informada!");
			}
			
			if (!preg_match('/^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}$/', $vars['recebto'])) {
				throw new Exception("A data de recebimento informada (" . $vars['recebto'] . ") é inválida!");
			}
			
			if (!isset($vars['ct_id']) || ($vars['ct_id'] == "")) {
				throw new Exception("Conta bancária não informada!");
			}
			
			if (!isset($vars['pd_id']) || ($vars['pd_id'] == "")) {
				throw new Exception("Pedido não informado!");
			}
				
			if (!isset($vars['pl_id']) || ($vars['pl_id'] == "")) {
				throw new Exception("Plano gerencial não informado!");
			}
			
			$conta = $this->dao->consultarPK($vars['id']);
			if ($conta[0]['recebto'] != "") {
				throw new Exception("Conta já recebida em " . $conta[0]['recebto'] . "!");
			}
			
			$registro['id'] 	 	= $vars['id'];
			$registro['data']		= $vars['data'];
			$registro['adquirente'] = $vars['ad_id'];
			$registro['historico'] 	= $vars['historico'];
			$registro['vcto'] 		= $vars['vcto'];
			$registro['vr_titulo']	= str_replace(',', '.', str_replace('.', '', $vars['vr_titulo']));
			$registro['juros']		= isset($vars['juros']) ? str_replace(',', '.', str_replace('.', '', $vars['juros'])) : 0;
			$registro['recebto']	= $vars['recebto'];
			$registro['vr_recebido']= $registro['vr_titulo'] + $registro['juros'];
			$registro['pedido']		= $vars['pd_id'];
			$registro['parcela']	= isset($vars['parcela']) ? $vars['parcela'] : "";
			$registro['tipo']		= isset($vars['tipo']) ? $vars['tipo'] : "O";
			$registro['plano']		= $vars['pl_id'];
			$registro['conta']		= $vars['ct_id'];
			$registro['historico2']	= isset($vars['historico2']) ? $vars['historico2'] : "";
								
			$this->Record 			= $this->dao->alterar($registro, false);

			// atualizar saldo da conta corrente
			$saldoDAO 				= new SaldoDAO();
			$saldo['conta']			= $registro['conta'];
			$saldo['vr_movimento']	= $registro['vr_recebido'];
			$saldo['dc']			= 'C';
			$saldo['historico']		= $registro['historico2'];
			$saldoDAO->inserir($saldo, false);
			
			// inserir movimento contábil
			$movtoDAO 				= new MovimentoDAO();
			$movto['plano']			= $registro['plano'];
			$movto['historico']		= $registro['historico2'];
			$movto['valor']			= $registro['vr_titulo'];
			$movtoDAO->inserir($movto, $finalizarTransacao && ($registro['juros'] == 0));
			if ($registro['juros'] <> 0) {
				$planoDAO			= new PlanoDAO();
				$plano 				= $planoDAO->consultarPK($registro['plano']);
				$plano				= $planoDAO->consultarCodigo(substr($plano[0]['codigo'], 0, 8) . "004");
				
				$movto['plano']		= $plano[0]['id'];
				$movto['historico']	= $registro['historico2'];
				$movto['valor']		= $registro['juros'];
				$movtoDAO->inserir($movto, $finalizarTransacao);
			}
			
			$this->Result  = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro ao tentar receber conta: " . $e->getMessage();
		}
	}
	
	public function estornar($vars) {
		$conta	= $this->dao->consultarPK($vars['id']);
		
		if ($conta[0]['recebto'] == "") {
			$this->excluir($vars);
		} else {
			try {
				// altera a conta
				$est['id'] 			= $conta[0]['id'];
				$est['recebto'] 	= "";
				$est['juros'] 		= 0;
				$est['vr_recebido']	= 0;
				$est['historico2']	= "";
				$this->dao->alterar($est, false);
				
				// estorna o valor recebido no saldo da conta corrente
				$saldoDAO 				= new SaldoDAO();
				$saldo['conta']			= $conta[0]['ct_id'];
				$saldo['vr_movimento']	= str_replace(',', '.', $conta[0]['vr_recebido']);
				$saldo['dc']			= 'D';
				$saldo['historico']		= "Estorno: " . $conta[0]['historico2'];
				$saldoDAO->inserir($saldo, false);
				
				// estorna o movimento contábil
				$movtoDAO 				= new MovimentoDAO();
				$movto['plano']			= $conta[0]['pl_id'];
				$movto['historico']		= "Estorno: " . $conta[0]['historico2'];
				$movto['valor']			= str_replace(',', '.', $conta[0]['vr_titulo']);
				$movtoDAO->inserir($movto, (str_replace(',', '', $conta[0]['juros']) == 0));
				if (str_replace(',', '', $conta[0]['juros']) > 0) {
					$planoDAO			= new PlanoDAO();
					$plano 				= $planoDAO->consultarPK($conta[0]['pl_id']);
					$plano				= $planoDAO->consultarCodigo(substr($plano[0]['codigo'], 0, 8) . "004");
				
					$movto['plano']		= $plano[0]['id'];
					$movto['historico']	= "Estorno: " . $conta[0]['historico2'];
					$movto['valor']		= str_replace(',', '.', $conta[0]['juros']);
					$movtoDAO->inserir($movto);
				}

				$this->Result  = "OK";
			} catch (Exception $e) {
				$this->Result  = "ERROR";
				$this->Message = "Erro ao tentar estornar conta: " . $e->getMessage();
			}
		}
	}
	
	public function excluir($vars) {
		try {
			$res = $this->dao->excluir($vars['id']);
			$this->Result  = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro ao tentar excluir conta a receber: " . $e->getMessage();
		}
	}
	
	public function suspenderConcessao($id_pedido, $finalizarTransacao = true) {
		try {
			$this->dao->suspenderConcessao($id_pedido, $finalizarTransacao);
			$this->Result = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro ao tentar quitar contas a receber. Id do pedido: $id_pedido <br /> Mensagem do erro: " . $e->getMessage();
		}
	}

	public function transferirConcessao($id_pedido, $id_adquirente, $finalizarTransacao = true) {
		try {
			$this->dao->transferirConcessao($id_pedido, $id_adquirente, $finalizarTransacao);
			$this->Result = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro ao tentar transferir contas a receber. Id do pedido: $id_pedido <br /> Mensagem do erro: " . $e->getMessage();
		}
	}
	
	public function consultarRenegociacao($vars) {
		try {
			if (!isset($vars['ad_id'])) {
				throw new Exception("Adquirente não informado!");
			}
			
			if (!isset($vars['tipo'])) {
				throw new Exception("Tipo de consulta não informado!");
			}
			
			switch($vars['tipo']) {
				case 'debitos': 
					$this->Records 	= $this->dao->consultarDebitos($vars['ad_id']);
					$this->Record	= $this->dao->consultarTotalDebitos($vars['ad_id']);
					break;
				case 'avencer': 
					$this->Records 	= $this->dao->consultarAVencer($vars['ad_id']);
					$this->Record	= $this->dao->consultarTotalAVencer($vars['ad_id']);
					break;
				case 'pagos': 
					$this->Records 	= $this->dao->consultarPagos($vars['ad_id']);
					$this->Record	= $this->dao->consultarTotalPagos($vars['ad_id']);
					break;
			}
			$this->Result  	= "OK";
		} catch (Exception $e) {
			$this->Result  	= "ERROR";
			$this->Message 	= "Erro ao consultar renegociação: " . $e->getMessage();
		}
	}
	
	public function renegociar($vars, $finalizarTransacao = true) {
		try {
			if (!isset($vars['id'])) {
				throw new Exception("Conta a Receber não informada!");
			}
			
			$conta['id'] = $vars['id'];
			$conta['recebto'] = date('d/m/Y');
			$conta['vr_recebido'] = 0;
			$conta['historico2'] = 'Renegociado';
			$this->dao->alterar($conta, $finalizarTransacao);
				
			$this->Result  	= "OK";
		} catch (Exception $e) {
			$this->Result  	= "ERROR";
			$this->Message 	= "Erro ao consultar renegociação: " . $e->getMessage();
		}
	}
	
	public function relatorio($vars) {
		try {
			$this->Records 	= $this->dao->consultarRelatorio(
					$vars['contas'], 
					$vars['dt_ini'], 
					$vars['dt_fim'], 
					$vars['tipo'], 
					$vars['tipo_conta'], 
					$vars['ordem']);
			$this->Result	= "OK";
		} catch (Exception $e) {
			$this->Result  	= "ERROR";
			$this->Message 	= "Erro ao gerar relatório de contas a receber: " . $e->getMessage();
		}
	}

	public function razao($vars) {
		try {
			$this->Records 	= $this->dao->consultarRazao($vars['tipo'], $vars['filtro']);
			$this->Result	= "OK";
		} catch (Exception $e) {
			$this->Result  	= "ERROR";
			$this->Message 	= "Erro ao gerar relatório razão: " . $e->getMessage();
		}
	}
	
	public function importar() {
		set_time_limit(0);
		$recs		= null;
		$ctIds		= array("22832" => 13, "22804" => 12);
		$contDAO	= new Cont_RecDAO();
		$vendDAO	= new Vend_LoteDAO();
		$adqDAO		= new AdquirenteDAO();
		$planoDAO	= new PlanoDAO();
		
		try {
			$fonte 		= file("cont_rec.csv");
			foreach($fonte as $num => $linha) {
				unset($reg);
				$reg 	= explode("#", $linha);
		
				for ($i = 0; $i < count($reg); $i++) {
					$reg[$i] = trim(str_replace('"', "", $reg[$i]));
				}
		
				$adq = $adqDAO->consultarCPF($reg[1]);
				if (!isset($adq[0])) {
					throw new Exception("Adquirente não encontrado: " . $reg[1]);
				}
				
				$ped = $vendDAO->consultarPedido($reg[8]);
				if (!isset($ped[0])) {
					throw new Exception("Pedido não encontrado: " . $reg[8]);
				}
				
				$mvto['data'] 		= $reg[0];
				$mvto['adquirente'] = $adq[0]['id'];
				$mvto['historico'] 	= addslashes($reg[2]);
				$mvto['vcto'] 		= $reg[3];
				$mvto['vr_titulo'] 	= substr($reg[4], 0, strpos($reg[4], ".") + 3);
				$mvto['juros'] 		= substr($reg[5], 0, strpos($reg[5], ".") + 3);
				$mvto['recebto'] 	= $reg[6];
				$mvto['vr_recebido']= substr($reg[7], 0, strpos($reg[7], ".") + 3);
				$mvto['pedido'] 	= $ped[0]['id'];
				$mvto['parcela'] 	= $reg[9];
				$mvto['tipo'] 		= $reg[10];
				$mvto['historico2'] = addslashes($reg[13]);
				
				if ($reg[11] != "") {
					$plano = $planoDAO->consultarCodigo($reg[11]);
					if (isset($plano[0])) {
						$mvto['plano']	= $plano[0]['id'];
					}
				}
				
				if ($reg[12] != "") {
					$mvto['conta']	= $ctIds[$reg[12]];
				}
				
				$novo = $this->dao->importar($mvto, false);
				if (!is_null($novo)) {
					$recs[] = $novo;
					unset($novo);
					unset($mvto);
				} else {
					throw new Exception("Erro na importação: " . var_dump($novo));
				}
			}
			$this->dao->commit();
			$this->Records = $recs;
			$this->Result  = "OK";
		} catch (Exception $e) {
			$this->Records = $recs;
			$this->Result  = "ERROR";
			$this->Message = "Erro ao importar contas a receber: " . $e->getMessage();
		}
	}
}
?>